package org.czl.gh;

import java.util.Arrays;

public class l996 {
    public static void main(String[] args) {
        numSquarefulPerms(new int[]{2,2,2});
    }
    static boolean isSquare(int x) {
        return  x == (int)Math.pow((int)Math.sqrt(x), 2);
    }
    static int n;
    public static int numSquarefulPerms(int[] nums){
        // 排序了 方便去重
        Arrays.sort(nums);
        n = nums.length;
        int ans = 0;
        for(int i = 0; i < n; i++){
            if(i > 0 && nums[i] == nums[i - 1])continue;
            ans += f(nums, nums[i], (1 << i) ^ ((1 << n) - 1));
        }
        return ans;
    }
    static int f(int[] nums, int pre, int status){
        if(status == 0){
            return 1;//要是所有的数 在某种特定规则下能选完 就表示可以加1选择方式
        }
        int ans = 0;
        for(int i = 0; i < n; i++){
            if((i > 0 && nums[i] == nums[i - 1]) && ((1 << (i - 1)) & status) != 0)continue;
            if(isSquare(nums[i] + pre) && ((1 << i) & status) != 0){
                ans += f(nums, nums[i], (1 << i) ^ status);
            }
        }
        return ans;
    }
}
